/*
给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
*/
#include <iostream>
#include <string>
#include <unordered_set>
#include <algorithm>

using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.length() == 0) {
            return 0;
        }

        int res = 0;
        int left = 0;

        // 记录字符是否出现过
        unordered_set<int> occ;

        for (int i = 0; i < s.length(); i++) {
            // 字符在该窗口出现过，滑动这个窗口，知道跳过这个字符
            while (occ.find(s[i]) != occ.end()) {
                // 窗口滑动过程中，将这个字符标记为未出现
                occ.erase(s[left]);
                left++;
            }

            // 标记出现过这个字符
            occ.insert(s[i]);
            res = max(res, i - left + 1);
        }

        return res;
    }
};

int main() {
    cout << Solution().lengthOfLongestSubstring("abcabcbb") << endl;
    return 0;
}